﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.OneCard.Res;

namespace OT.HikiSecureCenterApis.Service.OneCard
{
    /// <summary>
    /// 一卡通应用服务 --> 可视对讲
    /// </summary>
    public partial class OneCardService
    {
        #region 可视对讲功能接口
        /// <summary>
        /// 查询出入事件 /api/vis/v1/accessEvent/events
        /// 该接口可以查询发生在门口机、围墙机上的人员出入事件，支持多个维度来查询，支持按时间、人员、设备、卡号、事件类型五个维度来查询；
        /// 其中按事件类型来查询的方式，如果查询不到事件，存在两种情况，一种是该类型的事件没有发生过，所以查询不到，还有一种情况，该类型的事件发生过，
        /// 但是由于可视对讲管理组件对该事件类型订阅配置处于关闭状态，所以不会存储该类型的事件，导致查询不到，对于这种情况，需要到可视对讲管理组件中，将该事件类型的订阅配置打开。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="eventTypes">非必填，事件类型（10进制，需根据事件类型定义表中类型进行转换。参考附录D.2.2.1 可视对讲事件类型）
        /// https://open.hikvision.com/docs/7fdbf8c13bdb478a926bd2f0f7228a49?curNodeId=7fdbf8c13bdb478a926bd2f0f7228a49#df39f22a
        /// </param>
        /// <param name="personIds">非必填，人员ID集（最大支持10个人员搜索），多个以逗号隔开，获取人员列表v2 接口获取
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#aa136eca
        /// </param>
        /// <param name="cardNos">非必填，卡号集（最大支持10张卡片搜索），多个以逗号隔开， 获取卡片列表接口可以获取
        /// https://open.hikvision.com/docs/738daa9630df4073a75dd464d0cd4d86?curNodeId=738daa9630df4073a75dd464d0cd4d86#ab775d82
        /// </param>
        /// <param name="deviceIds">非必填，设备编号集（最大支持10个设备集搜索），多个以逗号隔开，查询可视对讲设备列表v2接口可以获取
        /// https://open.hikvision.com/docs/6ab9529338164fb6abc8bbaea1254fda?curNodeId=6ab9529338164fb6abc8bbaea1254fda#cbb3c30a
        /// </param>
        /// <param name="sort">非必填，排序字段（支持personName、deviceName、eventTime填写排序的字段名称，与order配对使用，不能单独使用，例如：”personName”）</param>
        /// <param name="order">非必填，升/降序（指定排序字段是使用升序（asc）还是降序（desc），与sort配对使用，不能单独使用，例如：”asc”）</param>
        /// <returns><see cref="ResAccessEvent"/></returns>
        public async Task<ResParameter<ResPageData<ResAccessEvent>>?> AccessEventAsync(ReqPageDate page, string eventTypes = null, string personIds = null,
            string cardNos = null, string deviceIds = null, string sort = null, string order = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAccessEvent>>("/api/vis/v1/accessEvent/events", 1.2, new
          {
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              startTime = page?.startTime,
              endTime = page?.endTime,
              eventTypes = eventTypes,
              personIds = personIds,
              cardNos = cardNos,
              deviceIds = deviceIds,
              sort = sort,
              order = order
          });
        /// <summary>
        /// 获取出入事件的图片 /api/vis/v1/accessEvent/eventPictures
        /// 通过该接口根据输入的图片的相对Uri地址，可以获取到具体的数据数据。
        /// 此接口返回Http Status 302 重定向，所以参数返回与其他接口有些差异。本接口的应答描述是图片存储服务器的返回信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="svrIndexCode">必填，存储接入服务（图片服务器唯一标识）</param>
        /// <param name="picUri">必填，图片地址</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AccessEventPicturesAsync(string svrIndexCode, string picUri) =>
          await SecureCenterApis.PostAsync<object>("/api/vis/v1/accessEvent/eventPictures", 1.2, new
          {
              svrIndexCode = svrIndexCode,
              picUri = picUri
          });
        #endregion

        #region 可视对讲资源接口
        /// <summary>
        /// 查询可视对讲设备列表v2 /api/resource/v2/visDevice/search
        /// 根据条件查询目录下有权限的可视对讲设备列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResVisDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResVisDevice>>?> VisDeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResVisDevice>>("/api/resource/v2/visDevice/search", 1.4, req);
        /// <summary>
        /// 增量获取可视对讲设备数据 /api/resource/v1/visDevice/timeRange
        /// 根据资源类型、时间段增量获取资源，包含已删除数据。其中开始日期与结束日期的时间差必须在1-48小时内。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填，页码、页大小、开始时间、结束时间</param>
        /// <returns><see cref="ResVisDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResVisDevice>>?> VisDeviceTimeRangeAsync(ReqPageDate page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResVisDevice>>("/api/resource/v1/visDevice/timeRange", 1.4, page);
        #endregion

        #region 可视对讲网管接口
        /// <summary>
        /// 获取可视对讲设备在线状态 /api/nms/v1/online/vis_device/get
        /// 根据条件获取可视对讲设备在线状态接口
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="regionId">非必填，区域id , 分页获取区域列表接口获取返回参数indexCode</param>
        /// <param name="ip">非必填，设备ip</param>
        /// <param name="indexCodes">非必填，可视对讲列表设备唯一标识列表，最大500，查询可视对讲设备列表v2接口获取返回参数接口获取返回参数indexCode</param>
        /// <param name="status">非必填，状态 1: 在线 0: 离线 -1: 未检测</param>
        /// <param name="page">非必填，页码、页大小</param>
        /// <param name="includeSubNode">非必填，是否包含下级（若regionId为空，则该参数不起作用） 1: 包含 0: 不包含</param>
        /// <returns><see cref="ResOnline"/></returns>
        public async Task<ResParameter<ResPageData<ResOnline>>?> GetVisDeviceOnlineAsync(string regionId = null, string ip = null, IList<string> indexCodes = null,
            string status = null, ReqPage page = null, string includeSubNode = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResOnline>>("/api/nms/v1/online/vis_device/get", 1.3, new
          {
              regionId = regionId,
              ip = ip,
              indexCodes = indexCodes,
              status = status,
              pageNo = page?.pageNo,
              pageSize = page?.pageSize,
              includeSubNode = includeSubNode
          });
        #endregion
    }
}
